package com.lmf.annotation.tx;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@ComponentScan("com.lmf.annotation.tx")
@EnableTransactionManagement   //开启事务注解
public class MyConfigOfTransactional {

    //数据源
    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        //连接数据库时区的影响
//        dataSource.setUrl("jdbc:mysql://localhost:3306/springtx_test?serverTimezone=GMT");
        dataSource.setUrl("jdbc:mysql://localhost:3306/springtx_test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true");
        dataSource.setUsername("root");
        dataSource.setPassword("552200");
        return dataSource;
    }

    /**
     * 使用@Bean注册组件，且需要用到容器中已注册的其他组件时：有两种方法可以从容器中获取
     * 方式一：在方法参数中加入已注册的容器组件类型，组件名需要跟容器中已存在的组件名一致，即，组件注册方法名
     * 方式二：在方法内部调用其他组件的注册方法
     * @return
     */
    //注册jdbc控制模板
    @Bean
    public JdbcTemplate jdbcTemplate(){
        JdbcTemplate template = new JdbcTemplate();
        //注入数据源：spring会对@Configuration配置类，进行特殊处理；给容器加组件的方法，多次调用只是从容器中找组件，而不是多次创建组件
        template.setDataSource(dataSource());
        return template;
    }

    //注册事务管理器
    @Bean
    public DataSourceTransactionManager transactionManager(){
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource());
        return transactionManager;
    }
}
